package com.itheima.service;

import com.itheima.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.*;
/*       -----------------------    以下是模拟数据库  给数据库中的数据添加权限设置       -----------------------           */

@Component("userService")
//   自定义一个  MyUserServiceImpl  继承 UserDetailsService
public class MyUserServiceImpl  implements UserDetailsService {

    @Autowired   // Spring 用于 给密码加密 的 类
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    Map<String,User> map = new HashMap<String,User>();
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //  模拟数据库    zs   123   lisi   123

        initData();
        //  定义权限
        Set<String> keys = map.keySet();
        List<GrantedAuthority> list  = new ArrayList<GrantedAuthority>();
        //   创建一个 授权管理器
        SimpleGrantedAuthority role_add = new SimpleGrantedAuthority("ROLE_ADD");
        //   给 list 集合中 添加 对应的 授权管理， 被list 添加的 数据 都被授权了  ("ROLE_ADD")
                   // 所以 因为  在 list 中 添加 ”zs“   所以zs 被赋值了 "ROLE_ADD"  角色
        list.add(role_add);

        List<GrantedAuthority> list1  = new ArrayList<GrantedAuthority>();
        SimpleGrantedAuthority role_delete = new SimpleGrantedAuthority("ROLE_DELETE");
        SimpleGrantedAuthority  query = new SimpleGrantedAuthority("QUERY");
        list1.add(role_delete);
        list1.add(query);
  //  表单 提交的密码  加密处理   123  ----  asfdasfafasfdasfsafd
        for (String key : keys) {
            if(username.equals(map.get(key).getUsername())){
                     // 在 list 中 添加 ”zs“
                  if("zs".equals(username)){
                      //   三个参数    1  账号   2 密码   数据库查询   3.  封装用户 所有角色或者权限
                      return new org.springframework.security.core.userdetails.User(
                              username,
           /*这里表示 将”zs“ 装到：   list 集合中
       SimpleGrantedAuthority role_add = new SimpleGrantedAuthority("ROLE_ADD");
       然后 ：  ——————-->   给list 集合中的数据 添加 ("ROLE_ADD") 角色    然后再xml 文件中  配置的该 ("ROLE_ADD") 可以访问 */
                              map.get(key).getPassword(),list
                      );
                  }
                if("lisi".equals(username)){
                    //   三个参数    1  账号   2 密码   数据库查询   3.  封装用户 所有角色或者权限
                    return new org.springframework.security.core.userdetails.User(
                            username,
                            map.get(key).getPassword(),list1
                    );
                }
            }
        }
        return null;
    }

    private void initData() {
        User user = new User();
        user.setUsername("zs");
        //给密码 加盐 加密
        String pas = bCryptPasswordEncoder.encode("123");
        user.setPassword(pas);

        User user1 = new User();
        user1.setUsername("lisi");
        user1.setPassword(pas);
        map.put("user1",user);
        map.put("user2",user1);

    }
}
